<?php

/**
 * SaveAction - Classe de sauvegarde des objets
 *
 * @package
 * @author Alexis Eric, 
 * Erra Prod. http://www.erraprod.com
 * @copyright Copyright (c) 2012 - Erra Prod
 * @access public
 */
class SaveAction extends Erra_System_Action {

    /**
     * saveCategory - Sauvegarde les catégories
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveCategory(Erra_Fields_Base_Object $field) {
        if (!strlen($field->prestation_type_name->value)) {
            $field->prestation_type_name->setError('Veuillez entrer un nom pour cette categorie');
        }

        if ($field->bErrors()) {
            $field->setError('Veuillez corriger les erreurs sur le formulaire');
        } else {
            self::saveSql($field);
            return "FORM_CLOSE_POPUP::erraSuccess('La catégorie a correctement été enregistrée')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveClient() - Sauvegarde les clients
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveClient(Erra_Fields_Base_Object $field) {
        if (!strlen($field->nom->value)) {
            $field->nom->setError('Veuillez entrer un nom');
        }
        if (!strlen($field->prenom->value)) {
            $field->prenom->setError('Veuillez entrer un prénom');
        }
        if (strlen($field->telephone_portable->value)) {
            $portable = $output = preg_replace('/[^0-9]/', '', $field->telephone_portable->value);
            if (strlen($portable) != 10 || (substr($portable, 0, 2) != '06' && substr($portable, 0, 2) != '07')) {
                $field->telephone_portable->setError('Le numéro de téléphone doit contenir 10 chiffres et commencer par 06 ou 07');
            }
        }
        if (strlen($field->telephone_fixe->value)) {
            $portable = $output = preg_replace('/[^0-9]/', '', $field->telephone_fixe->value);
            if (strlen($portable) != 10) {
                $field->telephone_fixe->setError('Le numéro de téléphone doit contenir 10 chiffre');
            }
        }
        if (strlen($field->email->value)) {
            if (!filter_var($field->email->value, FILTER_VALIDATE_EMAIL)) {
                $field->email->setError('Veuillez entrer une addresse e-mail valide');
            } else {
                $row = Erra_Core_DatabasePdo::SELECT('SELECT * FROM msa_clientobject WHERE email="' . $field->email->value . '" ');
                if (Erra_Core_DatabasePdo::rowCount()) {
                    $row = $row->fetch();
                    if ($field->getId() != $row->id)
                        $field->email->setError("L'adresse e-mail existe déja");
                }
            }
        }
        if ($field->bErrors()) {
            $field->setError('Veuillez corriger les erreurs sur le formulaire');
        } else {
            self::saveSql($field);
            return "FORM_CLOSE_POPUP::erraSuccess('Le client a bien été enregistré')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveSlot() - Sauvegarde un rendez-vous
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveSlot(Erra_Fields_Base_Object $field) {
        // Conversion en timestamp
        $field->slot_start->setValue(hour_str_to_time($field->slot_start->value));
        $field->slot_end->setValue(hour_str_to_time($field->slot_end->value));
        $field->slot_day->setValue(date_euro_to_time($field->slot_day->value));

        if ($field->event_type->value == 'presta') {
            // On vérifie que le client est correctement assigné
            if (!is_numeric($field->client_id->value)) {
                $field->client->setError('Vous devez sélectionner un client');
                return 'FORM_REFRESH_FIELD';
            }
            if (!$field->bErrors()) {
                $edit = false;
                $rdv = Erra_Core_DatabasePdo::SELECT('SELECT msa_agendaobject.email AS presta_email, msa_agendaobject.telephone_portable AS presta_portable, slot_day, slot_start, nom, prenom, msa_clientobject.email AS user_mail, msa_clientobject.telephone_portable AS user_portable FROM msa_slotobject, msa_clientobject, msa_agendaobject WHERE msa_slotobject.object_id ="' . $field->getObjectId() . '" AND msa_clientobject.id=msa_slotobject.client_id AND msa_agendaobject.id=msa_slotobject.agenda_id');
                // On vérifie si le rendez-vous a été modifié ou si c'est une nouvelle création
                Erra_System_Factory::saveField($field, 'SQL');
                if (Erra_Core_DatabasePdo::rowCount() && is_object($rdv)) {
                    // Cas d'édition du rendez-vous
                    //////////////////////////////
                    $rdv = $rdv->fetch();
                    if ($rdv->slot_start != $field->slot_start->value || $rdv->slot_day != $field->slot_day->value) {
                        // On envoie un mail seulement si le rednez-vous a été déplacé dans le futur
                        if ($field->slot_start->value > time()) {
                            $nom_complet = $rdv->nom . ' ' . $rdv->prenom;
                            $date_reservation = date('d/m/Y', $rdv->slot_day);
                            $heure_reservation = time_to_str_hour($rdv->slot_start);
                            $nom_etablissement = Config_GeneralConfigObject::get('nom_etablissement');
                            $nouvelle_date_reservation = date('d/m/Y', $rdv->slot_day);
                            $nouvelle_heure_reservation = time_to_str_hour($rdv->slot_start);
                            $placeHolders = array('{nom_complet}' => $nom_complet,
                                '{date_reservation}' => $date_reservation,
                                '{heure_reservation}' => $heure_reservation,
                                '{nom_etablissement}' => $nom_etablissement,
                                '{nouvelle_date_reservation}' => $nouvelle_date_reservation,
                                '{nouvelle_heure_reservation}' => $nouvelle_heure_reservation);

                            $result = Erra_Utils_Tools::sendTemplatedMail($rdv->user_mail, 'Mail/Mail_RdvEdit.phtml', $placeHolders);
                            $presta_mail = strlen($rdv->presta_email) ? $rdv->presta_email : '';
                            if (strlen($presta_mail)) {
                                $result = Erra_Utils_Tools::sendTemplatedMail($presta_mail, 'Mail/Mail_RdvEditClient.phtml', $placeHolders);
                            }
                        }
                    }
                } else {
                    // On récupere les infos sur le rendez vous et sur l'utilisateur afin d'envoyer un mail
                    $rdv = Erra_Core_DatabasePdo::SELECT('SELECT msa_agendaobject.email AS presta_email, prestation_name, internet_name, msa_agendaobject.telephone_portable AS presta_portable, slot_day, slot_start, nom, prenom, msa_clientobject.email AS user_mail, msa_clientobject.telephone_portable AS user_portable FROM msa_slotobject, msa_clientobject, msa_agendaobject, msa_prestationobject WHERE msa_slotobject.object_id ="' . $field->getObjectId() . '" AND msa_clientobject.id=msa_slotobject.client_id AND msa_agendaobject.id=msa_slotobject.agenda_id AND msa_prestationobject.id=' . $field->prestation_id->value);
                    $rdv = $rdv->fetch();
                    // Send Edit mail
                    $prestation_name = strlen($rdv->internet_name) ? $rdv->internet_name : $rdv->prestation_name;
                    $nom_complet = $rdv->nom . ' ' . $rdv->prenom;
                    $date_reservation = date('d/m/Y', $rdv->slot_day);
                    $heure_reservation = time_to_str_hour($rdv->slot_start);
                    $nom_etablissement = Config_GeneralConfigObject::get('nom_etablissement');
                    $nouvelle_date_reservation = date('d/m/Y', $field->slot_day->value);
                    $nouvelle_heure_reservation = time_to_str_hour($field->slot_start->value);
                    $placeHolders = array('{nom_complet}' => $nom_complet,
                        '{date_reservation}' => $date_reservation,
                        '{heure_reservation}' => $heure_reservation,
                        '{nom_etablissement}' => $nom_etablissement,
                        '{nom_prestation}' => $prestation_name);
                    $result = Erra_Utils_Tools::sendTemplatedMail($rdv->user_mail, 'Mail/Mail_RdvConfirm.phtml', $placeHolders);
                    if (Config_GeneralConfigObject::get('sms_client_newrdv') == 1) {
                        $result = Erra_Utils_Tools::sendTemplatedSms($rdv->user_portable, 'Sms/Sms_RdvConfirmUser.phtml', $placeHolders);
                    }
                }
            }
            // Syncroniser avec Google Calendar
            Tools_GCalendarObject::deleteEventFromUniqid($field->getObjectId());
            Tools_GCalendarObject::addEventFromUniqId($field->getObjectId());

            return "FORM_CLOSE_POPUP::erraSuccess('Modifications enregistrées');";
        } else {
            // PLAGE HORAIRE
            ////////////////
            if (!strlen($field->title->value) && $field->event_type->value == 'slot') {
                $field->title->setError('Vous devez entrer un titre pour cette plage horaire');
            }
// On vérifie les proprietés de répétition 
            if ($field->repeat_enabled->value == 'repeat') {
// Get actual properties and check if they match with the new ones
                $actual_repeat_properties = Erra_Core_DatabasePdo::SELECT('SELECT slot_day, repeat_time, repeat_period, repeat_occurency FROM msa_slotobject WHERE object_id ="' . $field->getObjectId() . '"');

                if (is_object($actual_repeat_properties)) {
                    $actual_repeat_properties = $actual_repeat_properties->fetch();
                    if ($actual_repeat_properties->repeat_time != $field->repeat_time->value ||
                            $actual_repeat_properties->repeat_period != $field->repeat_period->value ||
                            $actual_repeat_properties->repeat_occurency != $field->repeat_occurency->value) {
// Current repeat properties doesn't match with new ones, reset deleted occurencies
                        $field->deleted_occurencies->setValue('');
                    }
                }
                if ($field->occurency->value != 'original' && isset($actual_repeat_properties->slot_day) && is_numeric($actual_repeat_properties->slot_day)) {
                    $field->slot_day->setValue($actual_repeat_properties->slot_day);
                }
            }
            if (!$field->bErrors()) {
                Erra_System_Factory::saveField($field, 'SQL');
// TODO SEND DATA TO REFRESH CALENDAR
                return "FORM_CLOSE_POPUP::erraSuccess('Modifications enregistrées');";
            }
        }


        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveSqlAgendaOrPrestation() - Sauvegarde un agenda ou un type de prestation
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveSqlAgendaOrPrestation(Erra_Fields_Base_Object $field) {
        if (get_class($field) == 'Msa_PrestationObject') {
            if (!strlen($field->prestation_name->value)) {
                $field->prestation_name->setError('Veuillez entrer un nom pour cette prestation');
            }
            if (!strlen($field->duree->value) || !is_numeric($field->duree->value)) {
                $field->duree->setError('Veuillez entrer une durée (en minutes)');
            }
            if (!strlen($field->prix->value) || !is_numeric($field->prix->value)) {
                $field->prix->setError('Veuillez entrer un prix');
            }
            if (!strlen($field->description_courte_prestation->value)) {
                $field->description_courte_prestation->setError('Veuillez entrer une description courte');
            }
            if (!strlen($field->description_prestation->value)) {
                $field->description_prestation->setError('Veuillez entrer une description');
            }
        } else if (get_class($field) == 'Msa_AgendaObject') {

            if (!strlen($field->nom_agenda->value)) {
                $field->nom_agenda->setError('Veuillez entrer un nom pour cet agenda');
            }
            if ($field->location->value == '-') {
                $field->location->setError("Vous devez rattacher cet agenda à un lieu. <br/>Si aucun lieu n'existe, veuillez en créer au moins un");
            }
        }

        if (!$field->bErrors()) {
            self::saveSql($field);
            $fieldId = $field->getId();
            if (get_class($field) == 'Msa_PrestationObject') {
                if ($fieldId == -1) {
// Retreive field id
                    $row = Erra_Core_DatabasePdo::SELECT('SELECT id FROM msa_prestationobject WHERE object_id="' . $field->getObjectId() . '"')->fetch();
                    $fieldId = $row->id;
                }
                $assignation_array = $field->assignation->getValue();
                self::assignTableKeyValues(array('table' => 'back_agenda_prestation', 'key' => 'prestation_id', 'value' => 'agenda_id'), $fieldId, $assignation_array);
            } else if (get_class($field) == 'Msa_AgendaObject') {
                if ($fieldId == -1) {
// Retreive field id
                    $row = Erra_Core_DatabasePdo::SELECT('SELECT id FROM msa_agendaobject WHERE object_id="' . $field->getObjectId() . '"')->fetch();
                    $fieldId = $row->id;
                }
// Save prestations
                $assignation_array = $field->prestation->getValue();
                self::assignTableKeyValues(array('table' => 'back_agenda_prestation', 'key' => 'agenda_id', 'value' => 'prestation_id'), $fieldId, $assignation_array);
// Save accesses
                $assignation_array = $field->access->getValue();
                self::assignTableKeyValues(array('table' => 'back_agenda_access', 'key' => 'agenda_id', 'value' => 'access_id'), $fieldId, $assignation_array);
            }
            // Fill list of agendas for caching purposes
            $prestationList = Msa_PrestationObject::getPrestationTreeFromAgendaId();
            $prestationInfos = Msa_PrestationObject::getPrestationInfos();
            file_put_contents(DOCUMENT_ROOT . '/public/FastService/Cache/ComboPresta/fill_combo_presta_all.data', json_encode(array('combo' => $prestationList, 'infos' => $prestationInfos)));

            return "FORM_CLOSE_POPUP::erraSuccess('Modifications enregistrées')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveLocation - Sauvegarde un établissement
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveLocation(Erra_Fields_Base_Object $field) {
        if (!strlen($field->nom->value)) {
            $field->nom->setError('Veuillez entrer un nom');
        }
        if (!strlen($field->adresse->value)) {
            $field->adresse->setError('Veuillez entrer une adresse');
        }
        if (!strlen($field->ville_cp->value)) {
            $field->ville_cp->setError('Veuillez entrer un code postal');
        }
        if (!strlen($field->telephone->value)) {
            $field->telephone->setError('Veuillez entrer un numéro de téléphone (pour les annulations)');
        } else {
            if (strlen($field->telephone->value)) {
                $portable = $output = preg_replace('/[^0-9]/', '', $field->telephone->value);
                if (strlen($portable) != 10) {
                    $field->telephone->setError('Le numéro de téléphone doit contenir 10 chiffres');
                }
            }
        }
        if ($field->bErrors()) {
            $field->setError('Merci de corriger les erreurs sur le formulaire');
            return 'FORM_REFRESH_FIELD';
        }
        self::saveSql($field);
        return "FORM_CLOSE_POPUP::erraSuccess('Lieu enregistré')";
    }

    /**
     * saveExtraFieldsDefinition - Sauvegarde les champs supplémentaires
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveExtraFieldsDefinition(Erra_Fields_Base_Object $field) {
        // Get highest ID if it doesn't exists yet
        $tableName = $field->getTableName();
        if ($field->getId() < 0) {
            $sql = Erra_Core_DatabasePdo::SELECT('SELECT COUNT(id) AS item_count FROM ' . $tableName)->fetch();
            $item_id = 'extra_field_' . ($sql->item_count + 1);
            $field->extra_field_id->setValue($item_id);
        }
        if (!strlen($field->extra_field_name->value)) {
            $field->extra_field_name->setError('Veuillez entrer un libellé');
        }
        if (!$field->bErrors()) {
            Erra_System_Factory::saveField($field, 'SQL');
            return "FORM_CLOSE_POPUP::erraSuccess('Modifications enregistrées')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveCampaign - Sauvegarde une campagne mail ou SMS
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveCampaign(Erra_Fields_Base_Object $field) {
        if (!strlen($field->title->value)) {
            $field->title->setError('Veuillez entrer un titre pour cette campagne');
        }
        if (!strlen($field->content_campaign->value)) {
            $field->content_campaign->setError('Veuillez entrer le contenu de la campagne');
        }
        if (!$field->bErrors()) {
            Erra_System_Factory::saveField($field, 'SQL');
            return "FORM_CLOSE_POPUP::erraSuccess('Campagne enregistrée')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * saveTemplate - Sauvegarde un template mail
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveTemplate(Erra_Fields_Base_Object $field) {

        $filename = DOCUMENT_ROOT . '/application/Views/' . base64_url_decode($field->hidden_file->value);
        $result = file_put_contents($filename, wysiwyg_to_html($field->template_content->value));
        if ($result === false) {
            $field->setWarning('Impossible de modifier le template');
        } else {
            $field->setSuccess('Enregistrement effectué avec succès');
        }
        return 'FORM_REFRESH_FIELD';
    }

    /**
     * (fonction orpheline)
     * saveNotification - Sauvegarde une notification
     * 
     * @param Erra_Fields_Base_Object $field
     * @return string
     */
    public static function saveNotification(Erra_Fields_Base_Object $field) {
        Erra_Core_DatabasePdo::SELECT('SELECT id FROM ' . $field->getTableName() . ' WHERE agenda_id=' . $field->agenda_id->value);
        if (Erra_Core_DatabasePdo::rowCount()) {
            $field->agenda_id->setError('Une notification existe déja pour cet agenda');
        }
        if (!$field->bErrors()) {
            self::saveSql($field);
            return "FORM_CLOSE_POPUP::erraSuccess('Modifications enregistrées')";
        }
        return 'FORM_REFRESH_FIELD';
    }

    public static function moduleAction(Erra_Fields_Base_Object $field) {
        $field->setWarning('Impossible de modifier le template');
        return 'FORM_REFRESH_FIELD';
    }

} 